#include "Login.h"
#include <string>
#include <iostream>
#include <fstream>

using std::ifstream;
using std::ofstream;
using std::string;

void Login::agregarUsuario(Json::Value login){
	ifstream in("usuarios.json");
	Json::Value book_json;
	Json::Value usuario;
	in >> book_json;
	usuario["usuario"]=login["usuario"].asString();
	usuario["clave"]=login["clave"].asString();
	usuario["nivel"]=0;
	book_json["usuarios"].append(usuario);
	in.close();
	ofstream out("usuarios.json", std::ofstream::out);
	out << book_json;
	out.close();
}

int Login::procesarLogin(std::string loginStr){
	// 0 : login exitoso
	// 1 : error de login
	// 2 : usuario existente
	int codRetorno = 0;
	Json::Value value;
	Json::Reader reader;
	Json::Value book_json;
	reader.parse(loginStr,value,false);
	if(value["nueva"].asBool()==true){
	  if (!existeUsuario(value)){
		  agregarUsuario(value);
		  codRetorno=0;
	  }else{
		 codRetorno=2;
	  }
	}else{
		if(existeUsuario(value)){
			codRetorno=0;
		}else{
			codRetorno=1;
		}
	}
	return codRetorno;
}

int Login::procesarLogin(Json::Value value){
	// 0 : login exitoso
	// 1 : error de login
	// 2 : usuario existente
	int codRetorno;
	if(value["nueva"].asBool()==true){
	  if (!existeUsuario(value)){
		  agregarUsuario(value);
		  codRetorno=0;
	  }else{
		 codRetorno=2;
	  }
	}else{
		if(existeUsuario(value)){
			codRetorno=0;
		}else{
			codRetorno=1;
		}
	}
	return codRetorno;
}

bool Login::existeUsuario(Json::Value value){
	bool existe=false;
	ifstream ifs;
    ifs.open("usuarios.json", ifstream::in);
    if (!ifs.is_open()){
    	std::cout << "Error al abrir el archivo de usuarios" << std::endl;
    }
	Json::Value book_json;
	string user = "";
	string pass = "";
	ifs >> book_json;
	user = value["usuario"].asString();
	pass = value["clave"].asString();
	for (Json::Value::iterator it = book_json["usuarios"].begin();
			it != book_json["usuarios"].end(); ++it) {
		if((user.compare((*it)["usuario"].asString()) == 0)
				&& ((pass.compare((*it)["clave"].asString()) == 0)
												|| value["nueva"].asBool())){
			return true;
		}
	}
	ifs.close();
	return existe;
}

void Login::crearArchivoUsuarios(){
	ofstream out("usuarios.json", std::ofstream::out);
	Json::Value book_json(Json::objectValue), vectorJson(Json::arrayValue);
	book_json["usuarios"] = vectorJson;
	out << book_json;
	out.close();
}

int Login::getNivel(Json::Value value){
	int nivel;
	ifstream in("usuarios.json");
	Json::Value book_json;
	in >> book_json;

	for (Json::Value::iterator it = book_json["usuarios"].begin();
									it != book_json["usuarios"].end(); ++it) {
		if((value["usuario"].asString()==(*it)["usuario"].asString())
					&& (value["clave"].asString()==(*it)["clave"].asString())){
			nivel=(*it)["nivel"].asInt();
		}
	}
	in.close();
	return nivel;
}

void Login::sumarNivelUsuario(string user, int nivel){
	ifstream in("usuarios.json");
	Json::Value book_json;
	Json::Value usuario;
	int nivelUsuario;
	in >> book_json;
	for (Json::Value::iterator it = book_json["usuarios"].begin();
									it != book_json["usuarios"].end(); ++it) {
		if(user.compare((*it)["usuario"].asString()) == 0){
			nivelUsuario = (*it)["nivel"].asInt() ;
			if (nivel == nivelUsuario){
				(*it)["nivel"] = nivelUsuario + 1;
			}
		}
	}
	in.close();
	ofstream out("usuarios.json", std::ofstream::out);
	out << book_json;
	out.close();
}
